package sv.com.objetos.auxiliares;

import java.util.HashMap;
import java.util.Map;

public class CifradoCesar {
    private Map alfabeto;

    public CifradoCesar(){
        alfabeto = new HashMap();
        inicialAlfabeto();
    }

    private void inicialAlfabeto(){
        int index=0;
        for(int i=65;i<91;i++)
            alfabeto.put(index++, String.valueOf((char)i));//no incluye la enie
    }
    /* encriptado/desencriptado una cadena segun parametrizacion de la flag
     * @param cad cadena origen para encriptado/desencriptado segun parametrizacion de la flag
     * @param desplazamiento, es el desplazamiento para la sustitucion
     * @param flag, si es igual a CERO indica que se va a encriptar y diferente de CERO indica que es desencriptar
     * @return retorna la candena encriptado/desencriptado
     */
    public String encriptar(String cad,int desplazamiento,int flag){
        char []vetCad;
        char []vetCadRet;
        char aux;
        vetCad = cad.toCharArray();
        vetCadRet = new char[vetCad.length];
        for(int i=0;i<vetCad.length;i++){
            aux=buscarCaracter(vetCad[i],desplazamiento,flag);
            vetCadRet[i]=aux;
        }
        return String.valueOf(vetCadRet);
    }
    /* Buscar el caracter de la matriz dato el indice del arreglo
     * @param c, catacter a ser encriptado/desencriptado segun parametrizacion de la flag
     * @param delta, es el desplazamiento para la sustitucion
     * @param flag, si es igual a CERO indica que se va a encriptar y diferente de CERO indica que es desencriptar
     * @return retorna el caracter encriptado/desencriptado, si el caracter no se encuetra en el arreglo se regresa el mismo
     */
    private char buscarCaracter(char c,int delta,int flag){
        String letra;
        char ret;
        int index=-1;
        int indice = c-65;
        letra = (String)alfabeto.get(indice);//buscar caracter, sino existe devolver la misma
        if(letra== null)
            ret = c;
        else{
            if(flag == Constantes.ENCRIPTAR)
                index = (((int)c-65)+delta)%26;
            else
                index = (((int)c-65)-delta)%26;
            if(index < 0)
                index = 26 + index;
            letra = (String)alfabeto.get(index);
            ret = letra.toCharArray()[0];
        }
        return ret;
    }
}
